package com.smart.community.property.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.smart.community.commons.dto.property.PropertyCompanyQueryDTO;
import com.smart.community.commons.entity.property.PropertyCompany;
import com.smart.community.commons.result.PageResult;
import com.smart.community.commons.result.Result;
import com.smart.community.property.dto.PropertyCompanyAuditDTO;
import com.smart.community.property.dto.PropertyCompanyDTO;
import com.smart.community.property.vo.PropertyCompanyVO;

import java.util.List;

/**
 * 物业公司服务接口
 * @author Wu.Liang
 * @since 2025-06-29
 */
public interface IPropertyCompanyService extends IService<PropertyCompany> {
    
    /**
     * 分页查询物业公司列表
     * @param queryDTO 查询参数
     * @return 分页结果
     */
    Result<PageResult<PropertyCompanyVO>> getPropertyCompanyList(PropertyCompanyQueryDTO queryDTO);
    
    /**
     * 根据ID查询物业公司详情
     * @param id 物业公司ID
     * @return 物业公司详情
     */
    Result<PropertyCompanyVO> getPropertyCompany(Long id);
    
    /**
     * 根据公司编码查询物业公司
     * @param companyCode 公司编码
     * @return 物业公司信息
     */
    PropertyCompany getByCompanyCode(String companyCode);
    
    /**
     * 新增物业公司
     * @param propertyCompanyDTO 物业公司信息
     * @return 操作结果
     */
    Result<Void> createPropertyCompany(PropertyCompanyDTO propertyCompanyDTO);
    
    /**
     * 物业公司注册
     * @param propertyCompanyDTO 物业公司注册信息
     * @return 操作结果
     */
    Result<Void> registerPropertyCompany(PropertyCompanyDTO propertyCompanyDTO);
    
    /**
     * 更新物业公司信息
     * @param id 物业公司ID
     * @param propertyCompanyDTO 物业公司信息
     * @return 操作结果
     */
    Result<Void> updatePropertyCompany(Long id, PropertyCompanyDTO propertyCompanyDTO);
    
    /**
     * 删除物业公司
     * @param id 物业公司ID
     * @return 操作结果
     */
    Result<Void> deletePropertyCompany(Long id);
    
    /**
     * 审核物业公司
     * @param id 物业公司ID
     * @param auditDTO 审核信息
     * @return 操作结果
     */
    Result<Void> auditPropertyCompany(Long id, PropertyCompanyAuditDTO auditDTO);
    
    /**
     * 为物业公司分配社区
     * @param propertyCompanyId 物业公司ID
     * @param communityIds 社区ID列表
     * @return 操作结果
     */
    Result<String> assignCommunitiesToPropertyCompany(Long propertyCompanyId, List<Long> communityIds);
    
    /**
     * 获取当前用户的物业公司信息
     * @return 物业公司信息
     */
    Result<PropertyCompanyVO> getCurrentUserPropertyCompany();
    
    /**
     * 更新当前用户的物业公司信息
     * @param propertyCompanyDTO 物业公司信息
     * @return 操作结果
     */
    Result<Void> updateCurrentUserPropertyCompany(PropertyCompanyDTO propertyCompanyDTO);
    
    /**
     * 获取物业公司列表（用于下拉选择）
     * @return 物业公司列表
     */
    List<PropertyCompanyVO> getPropertyCompanyListForSelect();
    
    /**
     * 获取用户关联的物业公司列表
     * @param userId 用户ID
     * @return 物业公司列表
     */
    List<PropertyCompany> getUserPropertyCompanies(Long userId);
    
    /**
     * 获取物业公司已分配的社区列表
     * @param propertyCompanyId 物业公司ID
     * @param searchKeyword 搜索关键词（可选）
     * @return 社区列表
     */
    List<Object> getAssignedCommunities(Long propertyCompanyId, String searchKeyword);
    
    /**
     * 获取可分配的社区列表
     * @param propertyCompanyId 物业公司ID
     * @param searchKeyword 搜索关键词（可选）
     * @return 可分配的社区列表
     */
    List<Object> getAvailableCommunities(Long propertyCompanyId, String searchKeyword);
    
    /**
     * 检查公司编码是否已存在
     * @param companyCode 公司编码
     * @param excludeId 排除的ID
     * @return 是否存在
     */
    boolean isCompanyCodeExists(String companyCode, Long excludeId);
    
    /**
     * 检查用户是否有物业公司权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     */
    boolean hasPropertyCompanyPermission(Long userId, Long propertyCompanyId);
    
    /**
     * 检查用户是否有查看权限
     * @param userId 用户ID
     * @return 是否有权限
     */
    boolean hasViewPermission(Long userId);
    
    /**
     * 检查用户是否有查看指定物业公司的权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     */
    boolean hasViewPermission(Long userId, Long propertyCompanyId);
    
    /**
     * 检查用户是否有分配权限
     * @param userId 用户ID
     * @param propertyCompanyId 物业公司ID
     * @return 是否有权限
     */
    boolean hasAssignPermission(Long userId, Long propertyCompanyId);
    
    /**
     * 获取物业公司详情统计信息
     * @param propertyCompanyId 物业公司ID
     * @return 统计信息
     */
    Object getPropertyCompanyDetailStats(Long propertyCompanyId);
    
    /**
     * 给用户和物业公司更新或新增用户和物业公司的关联
     * @author Wu.Liang
     * @date 2025年8月7日
     * @param userId
     * @param propertyCompanyId
     * @throws Exception
     */
    void updateOrAddUserPropertyCompany(Long userId, Long propertyCompanyId);
} 